#include "blockQueue.hpp"
#include "task.hpp"
#include <pthread.h>
#include <unistd.h>
#include <ctime>


int task001(int x, int y)
{
    return x * y ;
}


void* consumer(void* args)
{
    blockQueue<Task>* bqueue = (blockQueue<Task>*)args ;
    while (true)
    {
        //获取任务
        Task t ;
        bqueue->pop(&t);
        cout<<"线程：" << pthread_self() << "任务处理结果:" << t() << endl;
    }
    
    return nullptr ;
}

void* productor(void* args)
{
     blockQueue<Task>* bqueue = (blockQueue<Task>*)args ;

     while(true)
     {
        //制作任务
        int x = rand()%5 + 1 ;
        usleep(rand()%2000);
        int y = rand()%11 + 1 ;
        Task t(x,y,task001);
        //生产任务 （向缓冲区提供任务）
        bqueue->push(t);
        //输出消息 
        cout << "线程:" << pthread_self() << "发布任务: task001" << endl ;
        sleep(1);  
     }
}



int main()
{
    //创建线程 //为什么用new ？ ？ ？ ？ ？ ？ ？
    blockQueue<Task>* bqueue = new blockQueue<Task>();
    
    pthread_t c[2];
    pthread_t p[2];

    printf("debug1\n");


    pthread_create(c,nullptr,consumer,bqueue);
    pthread_create(c + 1,nullptr,consumer,bqueue);
    pthread_create(p,nullptr,productor,bqueue);
    pthread_create(p + 1,nullptr,productor,bqueue);

    //回收线程
    pthread_join(c[0],nullptr);
    pthread_join(c[1],nullptr);
    pthread_join(p[0],nullptr);
    pthread_join(p[1],nullptr);

    delete bqueue ; 

    return 0 ;
}

